#include "MeshOutput.h"

void MeshOutput::MeshtoMat(std::string filename, GMesh mesh){
    const char* filename_c = filename.c_str();
    std::vector<std::vector<double>>coord = mesh.getcoord();
    std::vector<std::vector<uint>> getelement_P = mesh.getelement_P();
    std::vector<std::vector<uint>> getelement_L = mesh.getelement_L();
    std::vector<std::vector<uint>> getelement_S = mesh.getelement_S();
    std::vector<std::vector<uint>> getelement_V = mesh.getelement_V();

    MATFile* matfile = matOpen(filename_c, "w");
    if(coord.size()){
        mxArray* mx_coord = mxCreateDoubleMatrix(coord.size(), coord[0].size(), mxREAL);
        double* coord_pData = mxGetPr(mx_coord);  //获取矩阵元素指针
        for(int i = 0; i < coord.size(); i++){
            for(int j = 0; j < coord[0].size(); j++){
                coord_pData[i+j*coord.size()] = coord[i][j];
            }
        }
        matPutVariable(matfile, "coord", mx_coord);
        mxDestroyArray(mx_coord);
    }
    if(getelement_P.size()){
        mxArray* mx_element_P = mxCreateDoubleMatrix(getelement_P.size(), getelement_P[0].size(), mxREAL);
        double* element_P_pData = mxGetPr(mx_element_P);  //获取矩阵元素指针
        for(int i = 0; i < getelement_P.size(); i++){
            for(int j = 0; j < getelement_P[0].size(); j++){
                element_P_pData[i+j*getelement_P.size()] = getelement_P[i][j];
            }
        }
        matPutVariable(matfile, "element_P", mx_element_P);
        mxDestroyArray(mx_element_P);
    }
    if(getelement_L.size()){
        mxArray* mx_element_L = mxCreateDoubleMatrix(getelement_L.size(), getelement_L[0].size(), mxREAL);
        double* element_L_pData = mxGetPr(mx_element_L);  //获取矩阵元素指针
        for(int i = 0; i < getelement_L.size(); i++){
            for(int j = 0; j < getelement_L[0].size(); j++){
                element_L_pData[i+j*getelement_L.size()] = getelement_L[i][j];
            }
        }
        matPutVariable(matfile, "element_L", mx_element_L);
        mxDestroyArray(mx_element_L);
    }
    if(getelement_S.size()){
        mxArray* mx_element_S = mxCreateDoubleMatrix(getelement_S.size(), getelement_S[0].size(), mxREAL);
        double* element_S_pData = mxGetPr(mx_element_S);  //获取矩阵元素指针
        for(int i = 0; i < getelement_S.size(); i++){
            for(int j = 0; j < getelement_S[0].size(); j++){
                element_S_pData[i+j*getelement_S.size()] = getelement_S[i][j];
            }
        }
        matPutVariable(matfile, "element_S", mx_element_S);
        mxDestroyArray(mx_element_S);
    }
    if(getelement_V.size()){
        mxArray* mx_element_V = mxCreateDoubleMatrix(getelement_V.size(), getelement_V[0].size(), mxREAL);
        double* element_V_pData = mxGetPr(mx_element_V);  //获取矩阵元素指针
        for(int i = 0; i < getelement_V.size(); i++){
            for(int j = 0; j < getelement_V[0].size(); j++){
                element_V_pData[i+j*getelement_V.size()] = getelement_V[i][j];
            }
        }
        matPutVariable(matfile, "element_V", mx_element_V);
        mxDestroyArray(mx_element_V);
    }
    matClose(matfile);
}